package ar.com.ctrln.view.dashboard.calendar;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Button;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.calendar.ConsultarEventos;
import ar.com.ctrln.control.calendar.RegistrarEvento;
import ar.com.ctrln.persistence.model.contacto.Contacto;
import ar.com.ctrln.persistence.model.evento.EventoCalendario;
import ar.com.ctrln.persistence.model.evento.Participante;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class RegistrarContactosEventoController extends
		AbstractMinimizarVentana {

	private static final String CONSULTAR = "wConsultarEvento";

	private static final String REGISTRAR = "wRegistrar";

	private static final long serialVersionUID = -8526716449945125233L;

	@WireVariable
	private RegistrarEvento registrarEvento;

	@WireVariable
	private ConsultarEventos consultarEventos;

	@Wire
	private Window wRegistrarContactosEvento;

	@Wire
	private Listbox listaContactos;

	@Wire("#txtFilter")
	private Textbox txtFilter;

	@Wire
	private Label footer_label;

	@Wire
	private Button bAgregarParticipantes;

	private Set<Participante> contactosSeleccionados;

	private EventoCalendario evento;

	String parent = "";

	ListModelList<Contacto> modelo;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		// negrada!
		if (wRegistrarContactosEvento.getParent() != null)

			parent = wRegistrarContactosEvento.getParent().getId();

		if (parent.equals(REGISTRAR)) {

			evento = registrarEvento.getEvento();

		} else if (parent.equals(CONSULTAR)) {

			evento = consultarEventos.getEvento();
		} else {
			evento = registrarEvento.getEvento();
		}

		listaContactos.setMultiple(true);
		listaContactos.setCheckmark(true);

		modelo = new ListModelList<Contacto>();
		modelo.setMultiple(true);

		listaContactos.setModel(modelo);

		modelo.addAll(registrarEvento.listarContactos());

		contactosSeleccionados = new HashSet<Participante>();

		Set<Contacto> seleccionados = null;

		if (evento.getParticipantes() != null) {

			seleccionados = new HashSet<Contacto>();
			for (Participante p : evento.getParticipantes()) {
				seleccionados.add(p.getContacto());
			}
			modelo.setSelection(seleccionados);
		}

	}

	@Listen("onClick = #bAgregarParticipantes")
	public void guardarListaSeleccionados() {
		Set<Listitem> seleccionados = listaContactos.getSelectedItems();

		for (Listitem listitem : seleccionados) {
			Participante p = new Participante();
			p.setContacto((Contacto) listitem.getValue());
			p.setSeleccionado(false);
			p.setPresente(false);
			p.setEvento(evento);
			contactosSeleccionados.add(p);
		}
		if (parent.equals(REGISTRAR)) {
			evento.setParticipantes(contactosSeleccionados);
			wRegistrarContactosEvento.onClose();
			EventQueue<Event> eq = EventQueues.lookup(
					"seleccionar_participantes", EventQueues.DESKTOP, false);
			eq.publish(new Event("onButtonClick", bAgregarParticipantes,
					contactosSeleccionados));
		} else if (parent.equals(CONSULTAR)) {
			consultarEventos.eliminarParticipantes(evento.getParticipantes());
			evento.setParticipantes(contactosSeleccionados);
			wRegistrarContactosEvento.onClose();
		} else {// negrada!
			evento.setParticipantes(contactosSeleccionados);
			wRegistrarContactosEvento.onClose();
			EventQueue<Event> eq = EventQueues.lookup(
					"seleccionar_participantes", EventQueues.DESKTOP, false);
			eq.publish(new Event("onButtonClick", bAgregarParticipantes,
					contactosSeleccionados));
		}

	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Listen("onChanging = #txtFilter")
	public void getFilter(Event event) {
		((Textbox) event.getTarget())
				.setValue(((org.zkoss.zk.ui.event.InputEvent) event).getValue());

		ListModelList model = new ListModelList(getFilterBy(
				txtFilter.getValue(), modelo.getInnerList()));

		model.setMultiple(true);

		listaContactos.setModel(model);

		listaContactos.setMultiple(true);

		listaContactos.setCheckmark(true);

		if (listaContactos.getItemCount() > 0) {
			footer_label.setValue("");
			footer_label.setValue("Un total de "
					+ listaContactos.getItemCount() + " Contactos");
		} else {
			footer_label.setValue("Ningun Resultado...");
			footer_label.setValue("");
		}
		((Textbox) event.getTarget()).setFocus(true);
	}

	public static List<Contacto> getFilterBy(String condicion,
			Collection<Contacto> contactos) {
		List<Contacto> data = new ArrayList<Contacto>();
		for (Iterator<Contacto> i = contactos.iterator(); i.hasNext();) {
			Contacto tmp = i.next();
			if (tmp.getNombre().toLowerCase()
					.indexOf(condicion.trim().toLowerCase()) >= 0
					|| tmp.getApellido().toLowerCase()
							.indexOf(condicion.trim().toLowerCase()) >= 0
					|| tmp.getCargo().getNombre().toLowerCase()
							.indexOf(condicion.trim().toLowerCase()) >= 0
					|| tmp.getOrganizacion().getRazonSocial().toLowerCase()
							.indexOf(condicion.trim().toLowerCase()) >= 0
					|| tmp.getOrganizacion().getDireccion().getLocalidad()
							.getNombre()
							.indexOf(condicion.trim().toLowerCase()) >= 0) {
				data.add(tmp);
			}
		}
		return data;
	}
}
